什么是狭义的CSRF攻击
狭义的CSRF是指在黑客已经将代码植入受害用户的浏览器访问的页面的前提下,以“受害用户”的身份向服务端发起一个伪造的http请求,从而实现服务器CURD来执行读写操作,狭义的CSRF的原理很简单,实现难度也不大,无非就是写两行javascript代码的ajax调用一下服务端的rest接口,难度难在这么去找到XSS漏洞然后这么将恶意代码植入。
以下是一些常见的防御手法:
尽量使用POST请求:get请求太容易被利用,攻击者可以构造一个img标签,通过图片资源嵌入恶意操作,而img又不能被过滤掉。所以接口最好限制为POST请求
加入验证码:POST请求也不是绝对安全的,攻击者可以通过内嵌框架,构建隐藏表单,当我们访问这个网站时候,就自动将这个表单提交了,从而造成了一次CSRF的攻击。所以这时候我们可以采用加入验证码的方式,因为攻击者所构造出来的就是伪的请求,所以在某一次提交时候,让用户提交验证码,或者滑块验证,能够确保这是一次用户的行为,而非黑客行为。
验证Referer:http头存在一个字段Referer,它能够记录当前一次请求的来源地址。什么意思呢,当我们访问正常网站时候,调用了某个接口例如192.108.12.88/transferxxxxx ——>而攻击者构造的伪请求地址113.132.44.53/gg.html 由于攻击者对正常网站实施CSRF攻击他只能在自己的站点里面进行构造请求,所以当Referer传过来是跟当前网站不同的域名,经过后端判断,如果Referer的值不是当前的网页就拒绝此次请求。
Anti CSRF Token:CSRF攻击之所以能够成功,主要是因为黑客能够完全伪造用户的请求,在这次请求中,用户的信息是存在cookie中的,所以黑客可以在不知道这些验证信息的情况下直接利用用户的cookie去跳过安全认证,我们要防御CSRF关键在于请求放入的时候黑客不能去伪造信息,并且这个信息不存在cookie之中,所以我们就可以在通过http的请求中或者是头信息中加入一个随机产生的token,这个token就会存在服务端,通过拦截器去验证这个token,如果请求头中不存在token或者token不正确,拦截器就会认为这是一次CSRF攻击,拒绝此次请求。